﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crosland.Automotriz.Core;
namespace Crosland.Automotriz.Data.Dao.Linq
{
    public class clsTh_pedido_Imp_cabDAO
    {

        private readonly AutomotrizEntities ContextoDeObjs = new AutomotrizEntities();
        public bool Insertar(TH_PRONOSTICO_IMP_CAB Obj)
        {
            try
            {
                ContextoDeObjs.AddObject("TH_PRONOSTICO_IMP_CAB", Obj);
                ContextoDeObjs.SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool Actualiza_Estado(int nu_pedido, int id_estado)
        {
            try
            {
                ContextoDeObjs.ExecuteStoreCommand("update TH_PRONOSTICO_IMP_CAB set ID_ESTADO=" + id_estado + " where Nro_Pronostico=" + nu_pedido);
                return true;
            }
            catch
            {
                return false;
            }
        }

        public List<V_PRONOSTICO_IMP_CAB> listar()
        {

            List<V_PRONOSTICO_IMP_CAB> lista = new List<V_PRONOSTICO_IMP_CAB>();
            try
            {
                var q = from c in ContextoDeObjs.V_PRONOSTICO_IMP_CAB
                        select c;
                lista = q.ToList();
            }
            catch (Exception)
            {
            }
            return lista;
        }

        public List<V_PRONOSTICO_IMP_CAB> listarCabSeguimientoImpPopBuscar(int anio, int id_estado)
        {
            List<V_PRONOSTICO_IMP_CAB> lista = new List<V_PRONOSTICO_IMP_CAB>();
            try
            {
                var q = from c in ContextoDeObjs.V_PRONOSTICO_IMP_CAB

                        where c.FECHA_GEN.Year == anio && c.ID_ESTADO == id_estado &&
                        !(from s in ContextoDeObjs.T_IMP_IMPORTACION_CAB select s.NRO_PRONOSTICO).Any(x => x == c.Nro_Pronostico)
                        select c;

                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
                throw;
            }
            return lista;
        }

        public IEnumerable<Object> listarCabSeguimientoImpPopBuscar2(int id_estado)
        {
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from cab in ContextoDeObjs.V_PRONOSTICO_IMP_CAB
                        join det in ContextoDeObjs.V_PRONOSTICO_IMP_DET on cab.Nro_Pronostico equals det.Nro_Pronostico
                        where cab.ID_ESTADO == id_estado &&
                        !(from s in ContextoDeObjs.T_IMP_IMPORTACION_CAB select s.NRO_PRONOSTICO ?? 0).Any(x => x == cab.Nro_Pronostico)
                        group new { cab, det } by new
                        {
                            cab.Nro_Pronostico,
                            cab.FECHA_GEN,                            
                            cab.USER_NEW,
                            cab.USER_UPDATE,
                            cab.FEC_UPDATE,
                            cab.ID_ESTADO,
                            cab.NOM_ESTADO
                        } into g
                        select new
                        {
                            Nro_Pronostico = (Int32?)g.Key.Nro_Pronostico,
                            FECHA_GEN = (DateTime?)g.Key.FECHA_GEN,                           
                            g.Key.USER_NEW,
                            g.Key.USER_UPDATE,
                            FEC_UPDATE = (DateTime?)g.Key.FEC_UPDATE,
                            ID_ESTADO = (Int32?)g.Key.ID_ESTADO,
                            g.Key.NOM_ESTADO,
                            TOTAL_FOB = (System.Decimal?)g.Sum(p => p.det.cant_sug_real * p.det.fob_me)
                        };
           
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
                throw;
            }
            return lista;
        }

        public List<V_PRONOSTICO_IMP_CAB> listarCabSeguimientoImpPopBuscarxFechaPedido(DateTime? dtmFechaPedido, int? id_estado, int intCantLimite)
        {
            List<V_PRONOSTICO_IMP_CAB> lista = new List<V_PRONOSTICO_IMP_CAB>();
            try
            {
                var q = from c in ContextoDeObjs.V_PRONOSTICO_IMP_CAB
                        where c.FECHA_GEN.Year == dtmFechaPedido.Value.Year && c.FECHA_GEN.Month == dtmFechaPedido.Value.Month
                        && c.FECHA_GEN.Day == dtmFechaPedido.Value.Day && c.ID_ESTADO == id_estado &&
                        !(from s in ContextoDeObjs.T_IMP_IMPORTACION_CAB select s.NRO_PRONOSTICO).Any(x => x == c.Nro_Pronostico)
                        select c;
                lista = q.Take(intCantLimite).ToList();
            }
            catch (Exception)
            {
                lista = null;
                throw;
            }
            return lista;
        }

        public int UltimoNumero()
        {
            var max = 0;

            try
            {
                max = ContextoDeObjs.TH_PRONOSTICO_IMP_CAB.Select(x => x.Nro_Pronostico).Max();

            }
            catch (Exception)
            {
                max = 0;
                throw;
            }

            return max;
        }

        public IEnumerable<Object> Listar_cabecera(int nu_anio, int nu_estado)
        {
            IEnumerable<Object> lista = new List<Object>();
            var q = from c in ContextoDeObjs.TH_PRONOSTICO_IMP_CAB
                        join d in ContextoDeObjs.TH_PRONOSTICO_IMP_DET on c.Nro_Pronostico equals d.Nro_Pronostico
                        join e in ContextoDeObjs.TD_PRONOSTICO_ESTADO
                        on new { ID_ESTADO = (Int32)c.ID_ESTADO } equals new { ID_ESTADO = e.ID_ESTADO }
                        where c.FECHA_GEN.Year == nu_anio && c.ID_ESTADO == nu_estado
                        group new { c, d } by new
                        {
                            c.Nro_Pronostico,
                            c.FECHA_GEN,                           
                            c.ANO_MES_FIN,
                            c.ANO_MES_INI,                            
                            c.USER_NEW,
                            c.USER_UPDATE,
                            c.FEC_UPDATE,
                            c.ID_ESTADO,
                            e.NOM_ESTADO,
                          
                        } into g

                        select new

                        {
                            NRO_PRONOSTICO = (Int32?)g.Key.Nro_Pronostico,
                            FECHA_GEN = (DateTime?)g.Key.FECHA_GEN,                          
                            ANO_MES_INI = (String)g.Key.ANO_MES_INI.Substring(4, 6) + "-" + (String)g.Key.ANO_MES_INI.Substring(0, 4),
                            ANO_MES_FIN = (String)g.Key.ANO_MES_FIN.Substring(4, 6) + "-" + (String)g.Key.ANO_MES_FIN.Substring(0, 4),
                            ANO_INI = g.Key.ANO_MES_INI,
                            ANO_FIN = g.Key.ANO_MES_FIN,                           
                            g.Key.USER_NEW,
                            g.Key.USER_UPDATE,
                            FEC_UPDATE = (DateTime?)g.Key.FEC_UPDATE,
                            ID_ESTADO = (Int32?)g.Key.ID_ESTADO,
                            NOM_ESTADO = (String)g.Key.NOM_ESTADO,
                            total = (System.Decimal?)g.Sum(p => p.d.cant_sug_real * p.d.fob_me)
                           
                        };
                lista = q.OrderByDescending(x => x.FECHA_GEN).ToList();                        
            return lista;
        }





        public IEnumerable<Object> Listar_cabeceraPorAprobar(int nu_anio, int nu_estado,String strIdUsuario)
        {
            IEnumerable<Object> lista = new List<Object>();
            var q = from c in ContextoDeObjs.TH_PRONOSTICO_IMP_CAB
                    join d in ContextoDeObjs.TH_PRONOSTICO_IMP_DET on c.Nro_Pronostico equals d.Nro_Pronostico
                    join e in ContextoDeObjs.TD_PRONOSTICO_ESTADO
                    on new { ID_ESTADO = (Int32)c.ID_ESTADO } equals new { ID_ESTADO = e.ID_ESTADO }
                    where c.FECHA_GEN.Year == nu_anio && c.ID_ESTADO == nu_estado && c.ID_USUARIO_APRUEBA==strIdUsuario
                    group new { c, d } by new
                    {
                        c.Nro_Pronostico,
                        c.FECHA_GEN,
                        c.ANO_MES_FIN,
                        c.ANO_MES_INI,
                        c.USER_NEW,
                        c.USER_UPDATE,
                        c.FEC_UPDATE,
                        c.ID_ESTADO,
                        e.NOM_ESTADO,

                    } into g

                    select new

                    {
                        NRO_PRONOSTICO = (Int32?)g.Key.Nro_Pronostico,
                        FECHA_GEN = (DateTime?)g.Key.FECHA_GEN,
                        ANO_MES_INI = (String)g.Key.ANO_MES_INI.Substring(4, 6) + "-" + (String)g.Key.ANO_MES_INI.Substring(0, 4),
                        ANO_MES_FIN = (String)g.Key.ANO_MES_FIN.Substring(4, 6) + "-" + (String)g.Key.ANO_MES_FIN.Substring(0, 4),
                        ANO_INI = g.Key.ANO_MES_INI,
                        ANO_FIN = g.Key.ANO_MES_FIN,
                        g.Key.USER_NEW,
                        g.Key.USER_UPDATE,
                        FEC_UPDATE = (DateTime?)g.Key.FEC_UPDATE,
                        ID_ESTADO = (Int32?)g.Key.ID_ESTADO,
                        NOM_ESTADO = (String)g.Key.NOM_ESTADO,
                        total = (System.Decimal?)g.Sum(p => p.d.cant_sug_real * p.d.fob_me)

                    };
            lista = q.OrderByDescending(x => x.FECHA_GEN).ToList();
            return lista;
        }




        public IEnumerable<Object> Listar_cabeceraPorConfirmar(int nu_anio, int nu_estado, String strIdUsuario)
        {
            IEnumerable<Object> lista = new List<Object>();
            var q = from c in ContextoDeObjs.TH_PRONOSTICO_IMP_CAB
                    join d in ContextoDeObjs.TH_PRONOSTICO_IMP_DET on c.Nro_Pronostico equals d.Nro_Pronostico
                    join e in ContextoDeObjs.TD_PRONOSTICO_ESTADO
                    on new { ID_ESTADO = (Int32)c.ID_ESTADO } equals new { ID_ESTADO = e.ID_ESTADO }
                    where c.FECHA_GEN.Year == nu_anio && c.ID_ESTADO == nu_estado && c.ID_USUARIO_CONFIRMA == strIdUsuario
                    group new { c, d } by new
                    {
                        c.Nro_Pronostico,
                        c.FECHA_GEN,
                        c.ANO_MES_FIN,
                        c.ANO_MES_INI,
                        c.USER_NEW,
                        c.USER_UPDATE,
                        c.FEC_UPDATE,
                        c.ID_ESTADO,
                        e.NOM_ESTADO,

                    } into g

                    select new

                    {
                        NRO_PRONOSTICO = (Int32?)g.Key.Nro_Pronostico,
                        FECHA_GEN = (DateTime?)g.Key.FECHA_GEN,
                        ANO_MES_INI = (String)g.Key.ANO_MES_INI.Substring(4, 6) + "-" + (String)g.Key.ANO_MES_INI.Substring(0, 4),
                        ANO_MES_FIN = (String)g.Key.ANO_MES_FIN.Substring(4, 6) + "-" + (String)g.Key.ANO_MES_FIN.Substring(0, 4),
                        ANO_INI = g.Key.ANO_MES_INI,
                        ANO_FIN = g.Key.ANO_MES_FIN,
                        g.Key.USER_NEW,
                        g.Key.USER_UPDATE,
                        FEC_UPDATE = (DateTime?)g.Key.FEC_UPDATE,
                        ID_ESTADO = (Int32?)g.Key.ID_ESTADO,
                        NOM_ESTADO = (String)g.Key.NOM_ESTADO,
                        total = (System.Decimal?)g.Sum(p => p.d.cant_sug_real * p.d.fob_me)

                    };
            lista = q.OrderByDescending(x => x.FECHA_GEN).ToList();
            return lista;
        }



    }
}
